package com.jay.loadbalancer;

import com.jay.model.ServiceMetaInfo;

import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 轮询负载均衡器
 * 实现了LoadBalancer接口，用于在多个服务实例中进行轮询选择
 */
public class RoundRobinLoadBalancer implements LoadBalancer {

    /**
     * 当前轮询的下标
     * 使用AtomicInteger保证线程安全
     */
    private final AtomicInteger currentIndex = new AtomicInteger(0);

    /**
     * 选择一个服务实例
     *
     * @param requestParams 请求参数，本实现未使用
     * @param serviceMetaInfoList 服务实例列表
     * @return 选定的服务实例，如果没有可用的服务实例则返回null
     */
    @Override
    public ServiceMetaInfo select(Map<String, Object> requestParams, List<ServiceMetaInfo> serviceMetaInfoList) {
        // 如果服务列表为空，直接返回null
        if (serviceMetaInfoList.isEmpty()) {
            return null;
        }
        // 只有一个服务，无需轮询
        int size = serviceMetaInfoList.size();
        if (size == 1) {
            return serviceMetaInfoList.get(0);
        }
        // 使用取模算法进行轮询，确保每个服务实例均匀地被选中
        int index = currentIndex.getAndIncrement() % size;
        return serviceMetaInfoList.get(index);
    }
}
